
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 阿宾
 * Date: 2024-05-13
 * Time: 17:15
 */
class Base{
    public int a = 1;
    public int b = 2;
    public int d = 100;
    public void methodA(int a){
        System.out.println("父类的成员方法：methodA(int)");
    }
    public void methodB(){
        System.out.println("父类的成员方法：methodB()");
    }
    public void methodD(){
        System.out.println("父类的成员方法：methodD()");
    }
}
//子类
class Derived extends Base{
    public int c = 3;
    public int a = 10;
    public float b = 3.4f;
    public void method(){
        System.out.println(this.a);//访问的是子类的a
        System.out.println(this.b);//访问的是子类的b
        System.out.println(this.c);//访问的是子类的c
        System.out.println(this.d);//访问的是父类的d，因为子类中不含有d
        System.out.println("=========");
        System.out.println(super.a);//访问的是父类的a
        System.out.println(super.b);//访问的是父类的b
        System.out.println(super.d);//访问的是父类的d
    }
    public void methodA(){
        System.out.println("子类的成员方法：methodA()");
    }
    public void methodB(){
        System.out.println("子类的成员方法：methodB()");
    }
/*    public void methodD(){
        System.out.println("子类的成员方法：methodD()");
    }*/
    public void methodC(){
        methodA(1);//有参数，访问的是父类的方法，构成方法的重载
        methodA();//没有参数，访问的是子类的方法
        methodB();//访问的是子类的方法 构成方法的重写
        super.methodB();//通过super调用父类的成员方法
    }
}
public class Test01 {
    public static void main(String[] args) {
        Derived d1 = new Derived();
        d1.methodB();
        System.out.println(d1.a);//输出的是子类的成员变量
        System.out.println("===========");
        Base d2 = new Derived();
        System.out.println(d2.a);//输出父类的成员变量
        //System.out.println(d2.c); error,因为父类中没有成员变量c，所以编译不通过
        d2.methodB();//父类中有方法B，所以代码可以通过编译，运行时先找子类方法，子类中有方法B，所以调用子类方法B
        d2.methodA(1);//父类中有方法A(int)，所以代码可以通过编译，运行时先找子类方法，子类中没有方法A(int)，则调用父类方法B
        //d2.methodA();//error 父类中没有方法A(),所以代码不能通过编译
        d2.methodD();//父类中有方法D，所以代码可以通过编译，运行时先找子类方法，子类没有方法D，则调用父类方法D
        System.out.println("===========");
        Base d3 = new Base();
        System.out.println(d3.a);
        d3.methodB();//父类中有方法B，所以代码可以通过编译，运行时先找父类方法，父类中有方法B，所以调用父类方法B

        d3.methodA(1);//父类中有方法A(int)，所以代码可以通过编译，运行时先找父类方法，子类中没有方法A(int)，则调用父类方法B
    }

}
